package cn.fansunion.leecode.isNumber;

/**
 * 507. 完美数 对于一个 正整数，如果它和除了它自身以外的所有 正因子 之和相等，我们称它为 「完美数」。
 * 
 * 给定一个 整数 n， 如果是完美数，返回 true；否则返回 false。
 * 
 * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/perfect-number 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-2-19
 */
public class PerfectNumber {
    /*示例 1：
    
    输入：num = 28
    输出：true
    解释：28 = 1 + 2 + 4 + 7 + 14
    1, 2, 4, 7, 和 14 是 28 的所有正因子。
    示例 2：
    
    输入：num = 7
    输出：true
     
    
    提示：
    
    1 <= num <= 108*/
    /**
     * 从1到num-1，找出所有因子求和，同num比较。
     * @param num
     * @return
     */
    public boolean checkPerfectNumber(int num) {
        //优化点2点：num=1，特殊判断；遍历的最大值
        int sum = 0;
        for (int i = 1; i < num; i++) {
            if (num % i == 0) {
                sum += i;
            }
        }
        return sum == num;
    }
    
    /**
     * 有问题：本来想的是sum初始化为1，因为1是每个数的因子。但是，特殊num输入“1”，就没判断到排除自己。
     * 这个代码，排除自己本身作为因子，是通过i<num来判定的。
     * 因此：为了优化，结果反而坑了
     * 从1到num-1，找出所有因子求和，同num比较。
     * @param num
     * @return
     */
    public boolean checkPerfectNumberError(int num) {
        int sum = 1;
        for (int i = 2; i < num; i++) {
            if (num % i == 0) {
                sum += i;
            }
        }
        return sum == num;

    }
}
